#include "../head.h"


// int pthread_cancel(pthread_t thread);
// 向线程发送一个取消的请求，类似提前退出但是没有退出值

// int pthread_setcancelstate(int state, int *oldstate);
// 设置线程响应取消的状态 state PTHREAD_CANCEL_DISABLE不能响应 PTHREAD_CANCEL_ENABLE 能响应（默认）

// int pthread_setcanceltype(int type, int *oldtype);
// 设置线程响应取消的类型 PTHREAD_CANCEL_ASYNCHRONOUS 异步（立即响应） PTHREAD_CANCEL_DEFERRED 延迟（默认）
// 延迟响应遇到取消点函数才响应 取消点函数fprintf() fputc() fputs() sleep() printf() usleep()
void *thread_func(void *arg)
{
    // 设置不能响应取消的请求
    pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);

    // 设置立即响应取消的请求
    // pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
    int i = 0;
    
    while (i < 15)
    {
        printf("thread_func: %d\n", i++);
        sleep(1);
        if (i == 10)
        {
            printf("取消线程\n");
            pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
            printf("取消线程成功\n");
        }
        
    }
    printf("子线程结束\n");
}

int main()
{
    pthread_t thread;
    pthread_create(&thread, NULL, thread_func, NULL);
    
    for (int i = 0; i < 5; i++)
    {
        printf("main: %d\n", i);
        sleep(1);   
    }
    sleep(3);
    //取消线程
    pthread_cancel(thread);

    // 等待线程结束 发送段错误
    void *p = NULL;
    pthread_join(thread, &p);
    //因为线程被提前退出，所以p为NULL 解引用会段错误
    // printf("p: %d\n", *((int *)p));


    printf("主线程结束\n");
    return 0;
}